package pri.damai.xiaowu.auth.manager;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;

/**
 * 消息
 * @Desc
 * @Author DaMai
 * @Date 2021/10/18 15:38
 * 但行好事，莫问前程。
 */
@Slf4j
@Component
public class SmsManager {

    @Resource
    SmsRuleProperties smsRuleProperties;
    @Resource
    RedisTemplate<String, Object> redisTemplate;
    @Value("${sms.login-redis-key}")
    String smsLoginRedisKey;

    /**
     * 发送登录短信
     * @apiNote [附加描述]
     * @param phone 手机号
     * @param code 验证码
     * @author DaMai
     * @date 2021/10/19 18:37
     */
    public void sendLoginSms(String phone, String code) {
        log.info("发送了登录短信。phone:{},code:{}", phone, code);
    }

    /**
     * 删除验证码
     * @apiNote [附加描述]
     * @param phone 手机号
     * @author DaMai
     * @date 2021/10/19 18:37
     */
    public void deleteLoginCode(String phone) {
        redisTemplate.delete(smsLoginRedisKey + phone);
    }

    /**
     * 获取需要校验的登录验证码
     * @apiNote [附加描述]
     * @param phone 手机号
     * @return java.lang.String
     * @author DaMai
     * @date 2021/10/19 18:39
     */
    public String getLoginCode(String phone) {
        String code = (String) redisTemplate.opsForValue().get(smsLoginRedisKey + phone);
        if (StringUtils.isBlank(code)) {
            return code;
        }
        // 配置使用 jackson 序列化时，字符串外层多了双引号
        return code.replace("\"", "");
    }

    /**
     * 保存登录验证码
     * @apiNote [附加描述]
     * @param phone 手机号
     * @param code 验证码
     * @author DaMai
     * @date 2021/10/19 18:39
     */
    public void saveLoginCode(String phone, String code) {
        redisTemplate.opsForValue()
                .set(smsLoginRedisKey + phone, code, smsRuleProperties.getExpireTime(), TimeUnit.MINUTES);
    }

    /**
     * 生成登录验证码
     * @apiNote [附加描述]
     * @return java.lang.String
     * @author DaMai
     * @date 2021/10/19 18:46
     */
    public String createRandomSmsCode() {
        return String.valueOf(ThreadLocalRandom.current().nextInt(1000, 9999));
    }

    /**
     * 规则检测
     * @apiNote 未通过检测，抛业务异常
     * @param phone 手机号
     * @author DaMai
     * @date 2021/10/19 18:48
     */
    public void checkLimitRules(String phone) {

//        // 获取规则信息实体
//        String timesKey = smsRuleProperties.getRuleRedisKey() + phone;
//        SmsCodeLimit smsCodeLimit = (SmsCodeLimit) redisTemplate.opsForValue().get(timesKey);
//
//        // 如果第一次发送短信，初始化规则信息实体保存，并直接返回
//        if (Objects.isNull(smsCodeLimit)) {
//            SmsCodeLimit init = SmsCodeLimit.buildInit();
//            init.setLastTime(LocalDateTime.now());
//            init.setPhone(phone);
//            smsCodeLimit = init;
//            redisTemplate.opsForValue().set(timesKey, smsCodeLimit, smsRuleProperties.getLimitTime(), TimeUnit.MINUTES);
//            return;
//        }
//
//        // 校验一分钟内，只能发送一次
//        Duration between = Duration.between(LocalDateTime.now(), smsCodeLimit.getLastTime());
//        long seconds = between.abs().getSeconds();
//        if (smsRuleProperties.getLimitSingleTime() > seconds) {
//            ThrowUtil.throwException(ResultEnum.CODE_SEND_FREQUENT, ResultEnum.CODE_SEND_FREQUENT.format("请稍后重试"));
//        }
//
//        // 校验单位时间内，发送次数
//        if (smsCodeLimit.getLimitTimes() > smsRuleProperties.getLimitTimes()) {
//            ThrowUtil.throwException(ResultEnum.CODE_RULE_ERROR, ResultEnum.CODE_RULE_ERROR.format(smsRuleProperties.getLimitTime(), smsRuleProperties.getLimitTimes()));
//        }
//
//        // 修改发送次数与时间
//        smsCodeLimit.setLastTime(LocalDateTime.now());
//        smsCodeLimit.setLimitTimes(smsCodeLimit.getLimitTimes() + 1);
//        redisTemplate.opsForValue().set(timesKey, smsCodeLimit, smsRuleProperties.getLimitTime(), TimeUnit.MINUTES);
    }
}
